//#pragma once
//
//template <class Iterator, class Ref, class Ptr>
//class ReverseIterator
//{
//public:
//	typedef ReverseIterator<Iterator, Ref, Ptr> Self;
//
//	ReverseIterator(Iterator it)
//		:_it(it)
//	{}
//
//	Self& operator++()
//	{
//		--_it;
//		return *this;
//	}
//
//	Self operator++(int) {
//		ReverseIterator tmp(_it);
//		--_it;
//		return tmp;
//	}
//
//	Self& operator--()
//	{
//		++_it;
//	}
//
//	Ref operator*()
//	{
//		Iterator cur = _it;
//		return *(--cur);
//	}
//
//	Ptr operator->()
//	{
//		return &(operator*());
//	}
//	
//	bool operator!=(const Self& s)
//	{
//		return _it != s._it;
//	}
//
//	bool operator==(const Self& s)
//	{
//		return _it == s._it;
//	} 
//
//private:
//	Iterator _it;
//};

template<class Iterator,class T>
struct vector_reverse_iterator{
	typedef vector_reverse_iterator<Iterator, T> Self;
public:
	vector_reverse_iterator(Iterator s) {
		_it = s;
	}
	Self& operator++() {
		--_it;
		return *this;
	}
	Self operator++(int) {
		vector_reverse_iterator tmp(_it);
		--_it;
		return tmp;
	}
	Self& operator--()
	{
		++_it;
		return *this;
	}
	T operator*() {
		Iterator tmp = _it;
		return *(--tmp);
	}
	bool operator!=(Self s) {
		return _it != s._it;
	}
	bool operator==(Self s) {
		return _it == s._it;
	}
private:
	Iterator _it;
};